﻿/*
News 2a .NET
Copyright (c) 2011 Jakub "Cubix651" Cisło - http://cubix.one.pl

License: X11 (MIT) See README file.
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using Microsoft.Win32;
using System.Runtime.InteropServices;

//deklaracja enumeracji dotyczącej motywów w programie
public enum Skin { White, Yellow, Orange, Red, Blue, Darkblue, Purple, Green, Black, Transparent };

namespace News_2a.NET
{
    //struktura do otrzymania informacji o pasku zadań
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int X;
        public int Y;
        public int Width;
        public int Height;
    }

    public partial class Form1 : Form
    {
        //definicja zmiennych potrzebnych w programie
        WebClient sourceWeb;
        string codeSite, s;
        int i = 0, j = 0;
        string[] linki;
        string[] news;
        Point MouseAktualnaPoz, MouseNowaPoz, formPoz, formNowaPoz;
        Point MouseActualSize, MouseNewSize;
        Size formSize, formNewSize;
        RECT positionAndSizeTaskbar, screenWithoutTaskbar;
        bool mouseDown = false, sizeMouseDown = false, moveForm = true;
        bool newsFromSchoolWebsite = true, newsFromSpecialFile = true;
        string installDir, appData;

        //definicja metod WinAPI i PInvoke dla taskbara
        [DllImportAttribute("user32.dll")]
        private static extern int FindWindow(string className, string windowName);
        [DllImportAttribute("user32.dll")]
        private static extern int GetWindowRect(int hwnd, ref RECT positionAndSize);
        
        public Skin chosenThem = Skin.Black;

        //konstruktor klasy
        public Form1()
        {
            InitializeComponent();
            
            sourceWeb = new WebClient();
            news = new string[50];

            try
            {
                RegistryKey registry = Registry.LocalMachine.OpenSubKey("SOFTWARE\\News 2a .NET");
                if (registry == null) throw new Exception("Nie znaleziono klucza programu w rejestrze");

                //odczytanie ścieżki instalacji
                installDir = (string)registry.GetValue("InstallDir");
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy odczycie ustawień z rejestru.\n" + exc.Message);
                installDir = Environment.CurrentDirectory + "\\";
            }
            appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\News 2a .NET";
            if (File.Exists(appData + "\\save.xml")) read();
            else Directory.CreateDirectory(appData);

            //readFromRegistry();
            changeHeaderPosition();
            getTaskbarInfo();

            screenWithoutTaskbar = new RECT();
            defineAvailablePlace();
        }

        //metoda wywoływana w chwili zamykania programu - wywołuje metodę serializującą
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //saveToRegistry();
            save();
        }

        //metoda wywyoływana przy ładowaniu formy
        private void Form1_Shown(object sender, EventArgs e)
        {
            getNewsFromJEvents();
            if (newsFromSpecialFile)
                getNewsFromSpecialFile();
            else
                hideBoard();
            if (newsFromSchoolWebsite)
                getNewsFromSchoolWebsite();
            else
                hideSchoolWebsite();
        }

        //metoda pobiera informacje o pasku potrzebne do przyciagania
        private void getTaskbarInfo()
        {
            int handle = FindWindow("Shell_TrayWnd", null);
            positionAndSizeTaskbar = new RECT();
            GetWindowRect(handle, ref positionAndSizeTaskbar);
        }

        //region dotyczący newsów
        #region Newsy
        //metoda pobierająca nowoście ze specjalnie przygotowanego pliku na serwerze (dyżurni)
        public void getNewsFromSpecialFile()
        {
            try
            {
                //pobranie źródła strony
                codeSite = sourceWeb.DownloadString("http://zaprogramuj-sie.site40.net/2a/news/news.html");
                //wyłuskanie potrzebnych danych
                i = codeSite.IndexOf("@@@") + 3;
                j = codeSite.LastIndexOf("@@@") - i;
                s = codeSite.Substring(i, j);
                //wypisanie danych w etykiecie
                board.Text = s;
            }
            catch (Exception)
            {
                //MessageBox.Show("Wystąpił błąd przy pobieraniu danych aktualnych dyżurnych.\n" + exc.Message);
                //hideBoard();
                //newsFromSpecialFile = false;
                board.Text = "Błąd przy pobieraniu...";
            }
        }

        //metoda pobierająca newsy głównej strony z modułu JEvents
        public void getNewsFromJEvents()
        {
            try
            {
                //pobranie źródła strony
                codeSite = sourceWeb.DownloadString("http://2a.net2.pl/index.php");
                //wyłuskanie wiadomości JEvents
                i = codeSite.IndexOf("mod_events_latest_table") + 23;
                j = codeSite.IndexOf("</table>", i) - i;
                s = codeSite.Substring(i, j);
                //usunięcie znaków HTML
                i = s.IndexOf(">");
                s = s.Substring(i + 1, s.Length - i - 1);
                i = s.IndexOf("<");
                while (i >= 0)
                {
                    j = s.IndexOf(">");
                    if (j < 1) j = news.Length;
                    s = s.Remove(i, j - i + 1);
                    i = s.IndexOf("<");
                }
                //usunięcie ostatniego znaku nowej linii
                s = s.Remove(s.LastIndexOf('\n'), 1);
                //zamiana znaków na polskie
                s = s.Replace("Ä™", "ę");
                s = s.Replace("Ăł", "ó");
                s = s.Replace("Ä…", "ą");
                s = s.Replace("Ĺ›", "ś");
                s = s.Replace("Ĺ‚", "ł");
                s = s.Replace("ĹĽ", "ż");
                s = s.Replace("Ĺş", "ź");
                s = s.Replace("Ä‡", "ć");
                s = s.Replace("Ĺ„", "ń");
                s = s.Replace("Ä", "Ę");
                s = s.Replace("Ă“", "Ó");
                s = s.Replace("Ä„", "Ą");
                s = s.Replace("Ĺš", "Ś");
                s = s.Replace("Ĺ", "Ł");
                s = s.Replace("Ĺ»", "Ż");
                s = s.Replace("Ĺą", "Ź");
                s = s.Replace("Ä†", "Ć");
                s = s.Replace("Ĺ", "Ń");
                //przypisanie do tablicy newsów
                news = s.Split('\n');
                //przypisanie z tablicy do kontrolki
                newsList.Items.Clear();
                newsList.Items.AddRange(news);

                //wyłuskanie linków i przypisanie ich do tablicy
                i = codeSite.IndexOf("mod_events_latest_table") + 23;
                j = codeSite.IndexOf("</table>", i) - i;
                s = codeSite.Substring(i, j);
                int k = 0;
                j = 0;
                linki = new string[news.Length];
                while (k < news.Length)
                {
                    i = s.IndexOf("href", j) + 6;
                    j = s.IndexOf("\"", i);
                    linki[k] = "http://2a.net2.pl" + (s.Substring(i, j - i)).Replace("&amp;", "&");
                    k++;
                }
            }
            /*catch (IndexOutOfRangeException)
            {
                //MessageBox.Show("Wystąpił błąd przy odczytywaniu danych ze strony klasowej.\nNewsów jest za dużo ;)");
            }*/
            catch (Exception)
            {
                //MessageBox.Show("Wystąpił błąd przy pobieraniu danych ze strony klasowej.\n" + exc.Message);
                newsList.Items.Add("Błąd przy pobieraniu...");
            }
        }

        //metoda pobierająca ostatniego newsa ze strony szkoły
        public void getNewsFromSchoolWebsite()
        {
            try
            {
                //pobranie źródła strony
                codeSite = sourceWeb.DownloadString("http://gim2mielec.kei.pl/witaj/index.php");
                //wyłuskanie odpowiednich informacji
                i = codeSite.IndexOf("<li class=\"latestnews\">") + 23;
                j = codeSite.IndexOf("</li>", i) - i;
                s = codeSite.Substring(i, j);
                i = s.IndexOf("href") + 6;
                j = s.IndexOf("\"", i) - i;
                schoolWebsite.Tag = "http://gim2mielec.kei.pl" + s.Substring(i, j);
                i = s.IndexOf("<");
                while (i >= 0)
                {
                    j = s.IndexOf(">");
                    if (j < 1) j = news.Length;
                    s = s.Remove(i, j - i + 1);
                    i = s.IndexOf("<");
                }
                s = s.Replace("\n", "");
                s = s.Replace("\t", "");
                //zamiana znaków na polskie
                s = s.Replace("Ä™", "ę");
                s = s.Replace("Ăł", "ó");
                s = s.Replace("Ä…", "ą");
                s = s.Replace("Ĺ›", "ś");
                s = s.Replace("Ĺ‚", "ł");
                s = s.Replace("ĹĽ", "ż");
                s = s.Replace("Ĺş", "ź");
                s = s.Replace("Ä‡", "ć");
                s = s.Replace("Ĺ„", "ń");
                s = s.Replace("Ä", "Ę");
                s = s.Replace("Ă“", "Ó");
                s = s.Replace("Ä„", "Ą");
                s = s.Replace("Ĺš", "Ś");
                s = s.Replace("Ĺ", "Ł");
                s = s.Replace("Ĺ»", "Ż");
                s = s.Replace("Ĺą", "Ź");
                s = s.Replace("Ä†", "Ć");
                s = s.Replace("Ĺ", "Ń");
                schoolWebsite.Text = "Strona GIM2: " + s;
            }
            catch (Exception)
            {
                //MessageBox.Show("Wystąpił błąd przy pobieraniu danych ze strony szkoły.\n" + exc.Message);
                schoolWebsite.Text = "Strona GIM2";
            }
        }
        #endregion

        //region dotyczący skórek
        #region Skórki
        //metoda odpowiadająca za zmianę skinu na kolor podany w parametrze
        public void changeThemeToColor(Color foreground, Color background)
        {
            try
            {
                //forma
                this.BackColor = background;
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                this.TransparencyKey = Color.Empty;
                this.Opacity = 0.8;
                //label1
                this.label1.BackColor = Color.Transparent;
                this.label1.ForeColor = foreground;
                //newsList
                this.newsList.BackColor = background;
                this.newsList.BorderStyle = System.Windows.Forms.BorderStyle.None;
                this.newsList.ForeColor = foreground;
                //board
                this.board.BackColor = Color.Transparent;
                this.board.ForeColor = foreground;
                //classWebiste
                this.classWebsite.BackColor = background;
                this.classWebsite.LinkColor = foreground;
                //schoolWebiste
                this.schoolWebsite.BackColor = background;
                this.schoolWebsite.LinkColor = foreground;
                //configLabel
                //this.configLabel.BackColor = background;
                this.configLabel.ForeColor = foreground;
                //minimizeLabel
                this.minimizeLabel.BackColor = background;
                this.minimizeLabel.ForeColor = foreground;
                //exitLabel
                this.exitLabel.BackColor = background;
                this.exitLabel.ForeColor = foreground;
                //changeSizeLabel
                this.changeSizeLabel.BackColor = foreground;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy zmianie skórki.\n" + exc.Message);
            }
        }

        //metoda odpowiadająca za zmianę skinu na przeźroczysty
        public void changeThemeToTransparent()
        {
            try
            {
                //forma
                this.BackColor = Color.Silver;
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                this.TransparencyKey = Color.Silver;
                this.Opacity = 1.0;
                //label1
                this.label1.BackColor = Color.Transparent;
                this.label1.ForeColor = Color.Black;
                //newsList
                this.newsList.BackColor = Color.Silver;
                this.newsList.BorderStyle = System.Windows.Forms.BorderStyle.None;
                this.newsList.ForeColor = Color.Black;
                //board
                this.board.BackColor = Color.Transparent;
                this.board.ForeColor = Color.Black;
                //classWebsite
                this.classWebsite.BackColor = Color.Transparent;
                this.classWebsite.LinkColor = Color.Black;
                //schoolWebsite
                this.schoolWebsite.BackColor = Color.Transparent;
                this.schoolWebsite.LinkColor = Color.Black;
                //configLabel
                this.configLabel.BackColor = Color.Transparent;
                this.configLabel.ForeColor = Color.Black;
                //minimizeLabel
                this.minimizeLabel.BackColor = Color.Transparent;
                this.minimizeLabel.ForeColor = Color.Black;
                //exitLabel
                this.exitLabel.BackColor = Color.Transparent;
                this.exitLabel.ForeColor = Color.Black;
                //changeSizeLabel
                this.changeSizeLabel.BackColor = Color.Black;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy zmianie skórki.\n" + exc.Message);
            }
        }

        //metoda pomocnicza do zmiany skórki
        //ustawia Checked wszystkich pozycji na flase i jednej pozycji podanej w parametrze na true
        public void checkOneThem(System.Windows.Forms.ToolStripMenuItem one)
        {
            blackToolStripMenuItem.Checked = false;
            transparentToolStripMenuItem.Checked = false;
            redToolStripMenuItem.Checked = false;
            whiteToolStripMenuItem.Checked = false;
            darkblueToolStripMenuItem.Checked = false;
            blueToolStripMenuItem.Checked = false;
            greenToolStripMenuItem.Checked = false;
            orangeToolStripMenuItem.Checked = false;
            purpleToolStripMenuItem.Checked = false;
            yellowToolStripMenuItem.Checked = false;
            one.Checked = true;
        }
        #endregion

        //region dotyczący zmiany wyświetlanych elementów (dyżurnych i newsów ze strony szkoły)
        #region Wyświetlanie kontrolek
        //metoda pomocnicza, gdy ma być pokazywana kontrolka z dyżurnymi
        public void showBoard()
        {
            newsList.Anchor = AnchorStyles.None;
            board.Anchor = AnchorStyles.None;
            boardToolStripMenuItem.Checked = true;
            board.Visible = true;
            getNewsFromSpecialFile();
            newsList.Size = new Size(newsList.Width, Height - 80);
            newsList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            board.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
        }

        //metoda pomocnicza, gdy ma być pokazywana kontrolka z wiadomościami zes trony szkoły
        public void showSchoolWebsite()
        {
            schoolWebsiteToolStripMenuItem.Checked = true;
            schoolWebsite.Visible = true;
            getNewsFromSchoolWebsite();
        }

        //metoda pomocnicza, gdy nie ma być pokazywana kontrolka z dyżurnymi
        public void hideBoard()
        {
            newsList.Anchor = AnchorStyles.None;
            board.Anchor = AnchorStyles.None;
            boardToolStripMenuItem.Checked = false;
            board.Visible = false;
            newsList.Size = new Size(newsList.Width, Height - 50);
            newsList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            board.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
        }

        //metoda pomocnicza, gdy nie ma być pokazywana kontrolka z wiadomościami zes trony szkoły
        public void hideSchoolWebsite()
        {
            schoolWebsiteToolStripMenuItem.Checked = false;
            schoolWebsite.Visible = false;
        }
        #endregion

        //zdarzenie obsługujące przesuwanie formy
        #region Przesuwanie formy
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && moveForm)
            {
                mouseDown = true;
                MouseAktualnaPoz = Control.MousePosition;
                formPoz = Location;
            }
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseDown == true && moveForm)
            {
                MouseNowaPoz = Control.MousePosition;
                formNowaPoz.X = MouseNowaPoz.X - MouseAktualnaPoz.X + formPoz.X;
                formNowaPoz.Y = MouseNowaPoz.Y - MouseAktualnaPoz.Y + formPoz.Y;
                if(formNowaPoz.X > screenWithoutTaskbar.Width - this.Size.Width)
                {
                    formNowaPoz.X = screenWithoutTaskbar.Width - this.Size.Width;
                }
                else if (formNowaPoz.X < screenWithoutTaskbar.X)
                {
                    formNowaPoz.X = screenWithoutTaskbar.X;
                }
                if (formNowaPoz.Y > screenWithoutTaskbar.Height - this.Size.Height)
                {
                    formNowaPoz.Y = screenWithoutTaskbar.Height - this.Size.Height;
                }
                else if (formNowaPoz.Y < screenWithoutTaskbar.Y)
                {
                    formNowaPoz.Y = screenWithoutTaskbar.Y;
                }
                Location = formNowaPoz;
                formPoz = formNowaPoz;
                MouseAktualnaPoz = MouseNowaPoz;
            }
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && moveForm)
                mouseDown = false;
        }
        #endregion

        #region Zmiana rozmiaru formy
        private void changeSizeLabel_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                sizeMouseDown = true;
                MouseActualSize = Control.MousePosition;
                formSize = Size;
            }
        }

        private void changeSizeLabel_MouseMove(object sender, MouseEventArgs e)
        {
            if (sizeMouseDown)
            {
                MouseNewSize = Control.MousePosition;
                formNewSize.Width = formSize.Width + MouseNewSize.X - MouseActualSize.X;
                formNewSize.Height = formSize.Height + MouseNewSize.Y - MouseActualSize.Y;
                Size = formNewSize;
                formSize = formNewSize;
                MouseActualSize = MouseNewSize;
                changeHeaderPosition();
            }
        }

        private void changeSizeLabel_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                newsList.Size = new Size(newsList.Width, Height - (board.Visible?80 : 50));
                sizeMouseDown = false;
            }
        }

        private void changeSizeLabel_DoubleClick(object sender, EventArgs e)
        {
            Size = new Size(360,170);
            changeHeaderPosition();
        }

        public void changeHeaderPosition()
        {
            label1.Location = new Point((this.Size.Width - label1.Width) / 2, label1.Location.Y);
        }
        #endregion

        //metoda, zależnie od parametru, dodaje (true) lub usuwa (false) program z autostartu
        public bool Autostart(bool b)
        {
            try
            {
                RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                if (registry == null) throw new Exception("Brak klucza autostartu w rejestrze.");
                if (b)
                {
                    registry.SetValue("News 2a .NET", installDir + "News 2a .NET.exe");
                    //File.Copy("News 2a .NET.lnk", Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\News 2a .NET.lnk");

                }
                else
                {
                    registry.DeleteValue("News 2a .NET", false);
                    //File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\News 2a .NET.lnk");
                }
                return true;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy modyfiakcji rejestru - autostartu\n" + exc.Message);
                return false;
            }
        }

        //metoda tworząca w zmiennej obszar, w którym może "przebywać" program
        public void defineAvailablePlace()
        {
            if (positionAndSizeTaskbar.X == 0)
            {
                screenWithoutTaskbar.Width = Screen.PrimaryScreen.Bounds.Width;

                if (positionAndSizeTaskbar.Width == Screen.PrimaryScreen.Bounds.Width)
                {
                    screenWithoutTaskbar.X = 0;

                    if (positionAndSizeTaskbar.Height == Screen.PrimaryScreen.Bounds.Height) //pasek jest u dołu
                    {
                        screenWithoutTaskbar.Y = 0;
                        screenWithoutTaskbar.Height = positionAndSizeTaskbar.Y;
                    }
                    else //pasek jest na górze
                    {
                        screenWithoutTaskbar.Y = positionAndSizeTaskbar.Height;
                        screenWithoutTaskbar.Height = Screen.PrimaryScreen.Bounds.Height;
                    }
                }
                else //pasek jest po lewej
                {
                    screenWithoutTaskbar.X = positionAndSizeTaskbar.Width;
                    screenWithoutTaskbar.Y = 0;
                    screenWithoutTaskbar.Height = Screen.PrimaryScreen.Bounds.Height;
                }
            }
            else //pasek jest po prawej
            {
                screenWithoutTaskbar.X = 0;
                screenWithoutTaskbar.Width = positionAndSizeTaskbar.X;
                screenWithoutTaskbar.Y = 0;
                screenWithoutTaskbar.Height = Screen.PrimaryScreen.Bounds.Height;
            }
        }

        //metoda pomocnicza do zmiany czasu odświeżania
        //ustawia Checked wszystkich pozycji na flase i jednej pozycji podanej w parametrze na true
        public void checkOneTime(System.Windows.Forms.ToolStripMenuItem one)
        {
            sec30ToolStripMenuItem.Checked = false;
            min1ToolStripMenuItem.Checked = false;
            min5ToolStripMenuItem.Checked = false;
            min10ToolStripMenuItem.Checked = false;
            min15ToolStripMenuItem.Checked = false;
            min30ToolStripMenuItem.Checked = false;
            h1ToolStripMenuItem.Checked = false;
            one.Checked = true;
        }

        //nadpisanie zmiennej, dzięki czemu nie ma ikony przy przełączaniu [ALT] + [TAB]
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                // turn on WS_EX_TOOLWINDOW style bit
                cp.ExStyle |= 0x80;
                return cp;
            }
        }

        //region, w którym są metody przypisane do zdarzeń
        #region Zdarzenia

        //region dotyczący metod do zdarzeń w menu
        #region Menu
        private void showHideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Visible = !this.Visible;
            if (!this.TopMost)
            {
                this.TopMost = true;
                this.TopMost = false;
            }
        }

        private void lockToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lockToolStripMenuItem.Checked = !lockToolStripMenuItem.Checked;
            moveForm = !lockToolStripMenuItem.Checked;
        }

        private void alwaysOnTopToolStripMenuItem_Click(object sender, EventArgs e)
        {
            alwaysOnTopToolStripMenuItem.Checked = !alwaysOnTopToolStripMenuItem.Checked;
            this.TopMost = alwaysOnTopToolStripMenuItem.Checked;
        }

        private void startWithSystemToolStripMenuItem_Click(object sender, EventArgs e)
        {
            bool isOk = Autostart(!startWithSystemToolStripMenuItem.Checked);
            if (isOk) startWithSystemToolStripMenuItem.Checked = !startWithSystemToolStripMenuItem.Checked;
        }

        #region Odświeżanie
        private void sec30ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            refreshTimer.Interval = 30000;
            checkOneTime(sec30ToolStripMenuItem);
        }

        private void min1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            refreshTimer.Interval = 60000;
            checkOneTime(min1ToolStripMenuItem);
        }

        private void min5ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            refreshTimer.Interval = 300000;
            checkOneTime(min5ToolStripMenuItem);
        }

        private void min10ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            refreshTimer.Interval = 600000;
            checkOneTime(min10ToolStripMenuItem);
        }

        private void min15ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            refreshTimer.Interval = 900000;
            checkOneTime(min15ToolStripMenuItem);
        }

        private void min30ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            refreshTimer.Interval = 1800000;
            checkOneTime(min30ToolStripMenuItem);
        }

        private void h1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            refreshTimer.Interval = 3600000;
            checkOneTime(h1ToolStripMenuItem);
        }

        private void refreshTimer_Tick(object sender, EventArgs e)
        {
            Form1_Shown(null, null);
        }
        #endregion

        #region Wyświetlanie
        private void boardToolStripMenuItem_Click(object sender, EventArgs e)
        {
            newsFromSpecialFile = !boardToolStripMenuItem.Checked;
            if (newsFromSpecialFile)
                showBoard();
            else
                hideBoard();
        }

        private void schoolWebsiteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            newsFromSchoolWebsite = !schoolWebsiteToolStripMenuItem.Checked;
            if (newsFromSchoolWebsite)
                showSchoolWebsite();
            else
                hideSchoolWebsite();
        }
        #endregion

        #region Skórki
        private void blackToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.White, Color.Black);
            checkOneThem(blackToolStripMenuItem);
            chosenThem = Skin.Black;
        }

        private void transparentToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToTransparent();
            checkOneThem(transparentToolStripMenuItem);
            chosenThem = Skin.Transparent;
        }

        private void redToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.White, Color.DarkRed);
            checkOneThem(redToolStripMenuItem);
            chosenThem = Skin.Red;
        }

        private void whiteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.Black, Color.White);
            checkOneThem(whiteToolStripMenuItem);
            chosenThem = Skin.White;
        }

        private void blueToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.White, Color.DodgerBlue);
            checkOneThem(blueToolStripMenuItem);
            chosenThem = Skin.Blue;
        }

        private void darkblueToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.White, Color.MidnightBlue);
            checkOneThem(darkblueToolStripMenuItem);
            chosenThem = Skin.Darkblue;
        }

        private void greenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.White, Color.Green);
            checkOneThem(greenToolStripMenuItem);
            chosenThem = Skin.Green;
        }

        private void orangeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.Black, Color.DarkOrange);
            checkOneThem(orangeToolStripMenuItem);
            chosenThem = Skin.Orange;
        }

        private void purpleToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.White, Color.Purple);
            checkOneThem(purpleToolStripMenuItem);
            chosenThem = Skin.Purple;
        }

        private void yellowToolStripMenuItem_Click(object sender, EventArgs e)
        {
            changeThemeToColor(Color.Black, Color.Gold);
            checkOneThem(yellowToolStripMenuItem);
            chosenThem = Skin.Yellow;
        }
        #endregion

        private void infoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("News 2a .NET - Wersja 1.0\nWymagany .NET Framework 2.0 lub nowszy\nAutor: Jakub \"Cubix\" Cisło\ncubix651@gmail.com\nhttp://cubix.to.pl/\n\nWykonano na potrzeby klasowe i strony klasowej:\nhttp://2a.net2.pl/", "Inforamcje o programie");
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }
        #endregion

        //region do innych zdarzeń
        #region Kontrolki
        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Visible = !this.Visible;
                if (!this.TopMost)
                {
                    this.TopMost = true;
                    this.TopMost = false;
                }
            }
        }

        private void newsList_Click(object sender, EventArgs e)
        {
            try
            {
                if (newsList.SelectedIndex >= 0) System.Diagnostics.Process.Start(linki[newsList.SelectedIndex]);
            }
            catch (Exception) { }
            newsList.SelectedIndex = -1;
        }

        private void classWebsite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start("http://2a.to.pl/");
        }

        private void schoolWebsite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start(schoolWebsite.Tag.ToString());
        }

        private void configLabel_MouseClick(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Left) contextMenuStrip1.Show(Control.MousePosition);
        }

        private void minimizeLabel_Click(object sender, EventArgs e)
        {
            this.Visible = false;
        }

        private void exitLabel_Click(object sender, EventArgs e)
        {
            Close();
        }
        #endregion
        #endregion

        //zapisywanie do rejestru
        /*
        #region ZapisDoRejestru
        public void saveToRegistry()
        {
            try
            {
                RegistryKey registry = Registry.LocalMachine.OpenSubKey("SOFTWARE\\News 2a .NET", true);
                if (registry == null) throw new Exception("Nie znaleziono klucza programu w rejestrze");
                registry.SetValue("ChosenThem", (int)chosenThem);
                registry.SetValue("TopMost", this.TopMost ? 1 : 0);
                registry.SetValue("MoveForm", moveForm ? 1 : 0);
                registry.SetValue("NewsFromSpecialFile", newsFromSpecialFile ? 1 : 0);
                registry.SetValue("NewsFromSchoolWebsite", newsFromSchoolWebsite ? 1 : 0);
                registry.SetValue("Autostart", startWithSystemToolStripMenuItem.Checked ? 1 : 0);
                registry.SetValue("RefreshInterval", refreshTimer.Interval);
                registry.SetValue("X", this.Location.X);
                registry.SetValue("Y", this.Location.Y);
                registry.SetValue("Width", this.Size.Width);
                registry.SetValue("Height", this.Size.Height);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy zapisywaniu ustawień do rejestru.\n" + exc.Message);
            }
        }

        //odczytywanie z rejestru
        public void readFromRegistry()
        {
            try
            {
                RegistryKey registry = Registry.LocalMachine.OpenSubKey("SOFTWARE\\News 2a .NET");
                if (registry == null) throw new Exception("Nie znaleziono klucza programu w rejestrze");
                
                //odczytanie ścieżki instalacji
                installDir = (string)registry.GetValue("InstallDir");
                //ustalenie tematu
                chosenThem = (Skin)((int)registry.GetValue("ChosenThem"));
                switch ((int)chosenThem)
                {
                    case (int)Skin.Black:
                        blackToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Blue:
                        blueToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Darkblue:
                        darkblueToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Green:
                        greenToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Orange:
                        orangeToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Purple:
                        purpleToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Red:
                        redToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Transparent:
                        transparentToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.White:
                        whiteToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Yellow:
                        yellowToolStripMenuItem_Click(null, null);
                        break;
                }
                //usawienie, czy forma ma być zawsze na wierchu
                alwaysOnTopToolStripMenuItem.Checked = this.TopMost = (int)registry.GetValue("TopMost") == 0 ? false : true;
                //ustawienie zmiennej do zablokowania formy
                moveForm = (int)registry.GetValue("MoveForm") == 0 ? false : true;
                lockToolStripMenuItem.Checked = !moveForm;
                //ustawienie, czy program ma startować z systemem
                startWithSystemToolStripMenuItem.Checked = (int)registry.GetValue("Autostart") == 0 ? false : true;
                //ustawienie odpowiednio, czy będą pobierane dane o dyżurnych i newsach ze szkoły
                newsFromSpecialFile = (int)registry.GetValue("NewsFromSpecialFile") == 0 ? false : true;
                newsFromSchoolWebsite = (int)registry.GetValue("NewsFromSchoolWebsite") == 0 ? false : true;
                //ustawienie odświeżania
                refreshTimer.Interval = (int)registry.GetValue("RefreshInterval");
                //zaznaczenie odpowiedniej opcji w menu
                switch (refreshTimer.Interval)
                {
                    case 30000:
                        checkOneTime(sec30ToolStripMenuItem);
                        break;
                    case 60000:
                        checkOneTime(min1ToolStripMenuItem);
                        break;
                    case 300000:
                        checkOneTime(min5ToolStripMenuItem);
                        break;
                    case 600000:
                        checkOneTime(min10ToolStripMenuItem);
                        break;
                    case 900000:
                        checkOneTime(min15ToolStripMenuItem);
                        break;
                    case 1800000:
                        checkOneTime(min30ToolStripMenuItem);
                        break;
                    case 3600000:
                        checkOneTime(h1ToolStripMenuItem);
                        break;
                }
                //zmiana pozycji formy
                this.Location = new Point((int)registry.GetValue("X"), (int)registry.GetValue("Y"));
                //zmiana rozmiaru formy
                this.Size = new Size((int)registry.GetValue("Width"), (int)registry.GetValue("Height"));
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy odczycie ustawień z rejestru.\n" + exc.Message);
            }
        }
        #endregion
        */

        //region, w którym są 2 metody - serializująca i deserializująca
        #region Serializacja
        //serializuje dane
        public void save()
        {
            try
            {
                //tworzenie obiektu serializatora, któremu podajemy typ jaki będziemy serializować
                XmlSerializer Serializer = new XmlSerializer(typeof(Serialization));
                //tworzenie obiektu Serialization.
                Serialization saveForm = new Serialization();
                saveForm.them = chosenThem;
                saveForm.topMost = this.TopMost;
                saveForm.moveForm = this.moveForm;
                saveForm.boardVisible = this.newsFromSpecialFile;
                saveForm.schoolWebsiteVisible = this.newsFromSchoolWebsite;
                saveForm.autostart = this.startWithSystemToolStripMenuItem.Checked;
                saveForm.refreshInterval = this.refreshTimer.Interval;
                saveForm.x = this.Location.X;
                saveForm.y = this.Location.Y;
                saveForm.width = this.Size.Width;
                saveForm.height = this.Size.Height;
                //tworzenie strumienia danych XML powiązanego z plikiem save.xml
                XmlTextWriter XmlTextWriter = new XmlTextWriter(appData + "\\save.xml", Encoding.UTF8);
                //ustawienie robienia wcięć w pliku save.xml
                XmlTextWriter.Formatting = Formatting.Indented;
                //właściwy moment serializacji.
                Serializer.Serialize(XmlTextWriter, saveForm);
                //Zamknięcie strumienia danych
                XmlTextWriter.Close();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy zapisie ustawień\n" + exc.Message);
            }
        }

        //deserializuje dane
        public void read()
        {
            try
            {
                //tworzenie obiektu serializatora, któremu podajemy typ jaki będziemy serializować
                XmlSerializer Serializer = new XmlSerializer(typeof(Serialization));
                //tworzenie strumienia danych XML powiązanego z plikiem save.xml
                XmlTextReader XmlTextReader = new XmlTextReader(appData + "\\save.xml");
                //tworzenie pustego obiekt Serialization.
                Serialization readForm = null;
                //właściwy moment deserializacji.
                readForm = (Serialization)Serializer.Deserialize(XmlTextReader);

                //ustalenie tematu
                chosenThem = readForm.them;
                switch ((int)chosenThem)
                {
                    case (int)Skin.Black:
                        blackToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Blue:
                        blueToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Darkblue:
                        darkblueToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Green:
                        greenToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Orange:
                        orangeToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Purple:
                        purpleToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Red:
                        redToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Transparent:
                        transparentToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.White:
                        whiteToolStripMenuItem_Click(null, null);
                        break;
                    case (int)Skin.Yellow:
                        yellowToolStripMenuItem_Click(null, null);
                        break;
                }
                //usawienie, czy forma ma być zawsze na wierchu
                alwaysOnTopToolStripMenuItem.Checked = this.TopMost = readForm.topMost;
                //ustawienie zmiennej do zablokowania formy
                this.moveForm = readForm.moveForm;
                lockToolStripMenuItem.Checked = !moveForm;
                //ustawienie, czy program ma startować z systemem
                this.startWithSystemToolStripMenuItem.Checked = readForm.autostart;
                //ustawienie odpowiednio, czy będą pobierane dane o dyżurnych i newsach ze szkoły
                this.newsFromSpecialFile = readForm.boardVisible;
                this.newsFromSchoolWebsite = readForm.schoolWebsiteVisible;
                //ustawienie odświeżania
                this.refreshTimer.Interval = readForm.refreshInterval;
                //zaznaczenie odpowiedniej opcji w menu
                switch (refreshTimer.Interval)
                {
                    case 30000:
                        checkOneTime(sec30ToolStripMenuItem);
                        break;
                    case 60000:
                        checkOneTime(min1ToolStripMenuItem);
                        break;
                    case 300000:
                        checkOneTime(min5ToolStripMenuItem);
                        break;
                    case 600000:
                        checkOneTime(min10ToolStripMenuItem);
                        break;
                    case 900000:
                        checkOneTime(min15ToolStripMenuItem);
                        break;
                    case 1800000:
                        checkOneTime(min30ToolStripMenuItem);
                        break;
                    case 3600000:
                        checkOneTime(h1ToolStripMenuItem);
                        break;
                }
                //zmiana pozycji formy
                this.Location = new Point(readForm.x, readForm.y);
                //zmiana rozmiaru formy
                this.Size = new Size(readForm.width, readForm.height);
                // Zamykamy strumień danych powiązany z plikiem Samochód.xml

                XmlTextReader.Close();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Wystąpił błąd przy odczycie zapisanych ustawień.\n" + exc.Message);
            }
        }
        #endregion
    }
}
